﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Fiuba.Algo3.Titiritero.Vista;
using Fiuba.Algo3.Titiritero;

namespace AlgoHero.Vista
{
    public class VistaInstrumento : Figura, IPosicionable
    {
        private int ancho;
        private int alto;
        private int x;

        public int X
        {
            get { return x; }
            set { x = value; }
        }
        private int y;

        public int Y
        {
            get { return y; }
            set { y = value; }
        }
        private int anchoCarril;
        private int altoRegionHabilitada;
        private int anchoPermitido;

        public int AnchoPermitido
        {
            get { return anchoPermitido; }
        }
        private double intervaloDeSimulacion;
        private int incrementoY;

        public int IncrementoY
        {
            get { return incrementoY; }
        }
        private int cantidadDeCarriles;
        private double pixelsPorMS;

        public VistaInstrumento(int ancho, int alto, int x, int y, int cantidadDeCarriles, Color color, double intervaloDeSimulacion): base(color)
        {
            this.ancho = ancho;
            this.alto = alto;
            this.cantidadDeCarriles = cantidadDeCarriles;
            this.anchoCarril = this.ancho / this.cantidadDeCarriles;
            this.altoRegionHabilitada = this.anchoCarril;
            this.anchoPermitido = anchoCarril - 15;
            this.x = x;
            this.y = y;
            this.intervaloDeSimulacion = intervaloDeSimulacion;
            this.incrementoY = 2;
            this.pixelsPorMS = this.incrementoY / this.intervaloDeSimulacion;
            this.Posicionable = this;

        }

        public double ObtenerPosicionYEnCarril(double duracionFisicaEnSegundos)
        {
            // devuelve la posicion en y para que el objeto caiga por pantalla a tiempo

            double duracionFisicaEnMS = duracionFisicaEnSegundos * 1000;

            return (-1) * (duracionFisicaEnMS * this.pixelsPorMS);

        }

        public TimeSpan TiempoQueElPrimerBotonTocaLaRegionHabilitada()
        {
            double tiempo = (1 / this.pixelsPorMS) * (this.alto - this.altoRegionHabilitada);
            return new TimeSpan(0, 0, (int)(tiempo / 1000));
        }

        public int ObtenerPosicionXEnCarril(int numeroDeCarril)
        {
            // devuelve la posicion en x para colocar un boton bien centrado en el carril indicado

            if (numeroDeCarril < 1 || numeroDeCarril > this.cantidadDeCarriles)
            {
                throw new ArgumentException("El número de carril es inválido");
            }
            return (numeroDeCarril - 1) * (this.anchoCarril) + this.x + (this.anchoCarril - this.anchoPermitido) / 2;
        }

        public override void Dibujar(ISuperficieDeDibujo superficieDeDibujo)
        {
            Graphics grafico = (Graphics)superficieDeDibujo.Buffer;

            // Dibuja el brazo de la guitarra
            using (SolidBrush brocha = new SolidBrush(this.Color))
            {
                try
                {
                    grafico.FillRectangle(brocha, this.x, this.y, this.ancho, this.alto);
                }
                catch (NullReferenceException)
                {
                }
            }

            // Dibuja las cuerdas
            int inicialX = this.x;
            int inicialY = this.y;
            int finalX = this.x;
            int finalY = this.y + this.alto;
            using (SolidBrush brocha = new SolidBrush(Color.Black))
            {
                Pen pen = new Pen(brocha);
                for (int i = 0; i < this.cantidadDeCarriles + 1; i++)
                {
                    grafico.DrawLine(pen, inicialX, inicialY, finalX, finalY);
                    inicialX += this.anchoCarril;
                    finalX += this.anchoCarril;
                }
            }

            // Dibuja las líneas que delimitan la zona para tocar
            using (SolidBrush brocha = new SolidBrush(Color.Black))
            {
                Pen pen = new Pen(brocha);
                inicialX = this.x;                
                inicialY = this.y + (this.alto - this.altoRegionHabilitada);
                finalX = this.x + this.ancho;
                finalY = inicialY;
                grafico.DrawLine(pen, inicialX, inicialY, finalX, finalY);
                inicialY += this.altoRegionHabilitada;
                finalY = inicialY;
                grafico.DrawLine(pen, inicialX, inicialY, finalX, finalY);
            }
            
        }
    }
}
